"""
    xfree/__init__.py
    ~~~~~~~~~~~~~~~~~~~~~
    文件描述：初始化XFree
    作者：xfree
    邮箱：cy_83k@qq.com
"""
import os
from flask import Flask
from xfree.utils.init import (
    init_config,
    init_celery,
    init_extensions,
    init_plugin,
    init_blueprint,
    init_template_filters,
    init_context_processor,
    init_before_handlers,
    init_after_handlers,
    init_error_handlers,
    init_migrations,
    init__translations,
)
from xfree.extensions import celery
### 需要初始化提前加载的模块开始 ###
from .utils import markup  # noqa
from .auth import views as auth_views  # noqa
from .utils.deprecation import XFreeDeprecation # noqa
from .display.navigation import NavigationContentType # noqa
from .forum import views as forum_views  # noqa
from .admin import views as admin_views  # noqa
from .user import views as user_views  # noqa
### 需要初始化提前加载的模块结束 ###
# 版本号
__version__ = "1.0.0"

import logging
logger = logging.getLogger(__name__)


# 构建app的工厂函数
def create_app(config=None, instance_path=None):
    """创建app对象-工厂函数
    :param config:
    :param instance_path:
    :return:app
    """
    # 创建app对象
    app = Flask(__name__, instance_path=instance_path, instance_relative_config=True)
    # 初始化app
    # 判断实例文件夹是否存在，如果不存在则创建
    if not os.path.exists(app.instance_path):
        # 如果不存在，使用 os.makedirs 创建实例文件夹及其所有必要的父目录
        os.makedirs(app.instance_path)
    # 01.初始化配置
    print("*********** 初始化配置 **********")
    init_config(app, config)
    app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False
    # 02.初始化Celery多任务管理器
    print("*********** 初始化Celery多任务管理器 **********")
    init_celery(app, celery)
    # 03.初始化加载扩充
    print("*********** 初始化加载扩充 **********")
    init_extensions(app)
    # 04.初始化加载插件
    print("*********** 初始加载化插件 **********")
    init_plugin(app)
    # 05.初始化蓝图
    print("*********** 初始化加载蓝图 **********")
    init_blueprint(app)
    # 06.初始化模板过滤器
    print("*********** 初始化模板过滤器 **********")
    init_template_filters(app)
    # 07.初始化上下文处理器
    print("*********** 初始化上下文处理器 **********")
    init_context_processor(app)
    # 08.初始化请求前置操作
    print("*********** 初始化请求前置操作 **********")
    init_before_handlers(app)
    # 09.初始化请求后置操作
    print("*********** 初始化请求后置操作 **********")
    init_after_handlers(app)
    # 10.初始化错误处理
    print("*********** 初始化错误处理 **********")
    init_error_handlers(app)
    # 11.初始化数据库迁移
    print("*********** 初始化数据库迁移 **********")
    init_migrations(app)
    # 12.初始化翻译
    print("*********** 初始化翻译 **********")
    init__translations(app)
    # 13初始化XFree插件
    print("*********** 初始化XFree插件 **********")
    app.pluggy.hook.xfree_additional_setup(app=app, pluggy=app.pluggy)
    print("*********** 完成初始化 **********")
    return app
